package com.qfmy.core.security.impl;

import com.alibaba.fastjson.JSON;
import com.qfmy.common.utils.WebUtils;
import com.qfmy.core.pojo.entity.ErrorCode;
import com.qfmy.core.pojo.entity.ResultMessage;
import com.qfmy.core.pojo.exception.CustomException;
import lombok.SneakyThrows;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @ClassName: AuthenticationEntryPointImpl
 * @author： zhengjt
 * @data： 2022/11/19 15:43
 * @version：1.0
 * @描述： 认证失效，需要登录，抛出异常
 *      PS:此处因是方法实现，无法抛出异常，只能直接输出前端信息。
 *          此处与我想法产生冲突，在我看来，我应该要将所有的输出返回把控在手里，而非如此处场景，直接输出前端，
 *          直接输出是方便了不少，但同时也是埋下了隐患，就好像日后如果需要排查问题，或者对什么逻辑进行统一处理，即有可能因为这一点的小问题而排查不到之类的。
 *          相当于这是一个变数。
 *          暂且记录，因整合此处为整合框架，所以暂时放着。
 */
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {

//        throw new CustomException(ErrorCode.USER_LOGIN_FAIL);
        ResultMessage resultMessage = new ResultMessage(false,ErrorCode.USER_LOGIN_FAIL.getCode(),ErrorCode.USER_LOGIN_FAIL.getMessage());
        String json = JSON.toJSONString(resultMessage);
        WebUtils.renderString(httpServletResponse, json);
    }
}
